home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 142
/
Gekkan Dennou Club - 2000.3 Vol. 142 (Japan).7z
/
Gekkan Dennou Club - 2000.3 Vol. 142 (Japan) (Track 1).bin
/
tools
/
s_tool
/
scsisub.c
< prev
next >
Wrap
Text File
|
1999-06-29
|
21KB
|
966 lines
#include "JX250.H"
#include <sys\iocs.h>
#include <sys\dos.h>
#include <sys\scsi.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define SCERR 1
#define QQ0(A) ( (A)>>4 )
#define QQ1(A) ( ((A)>>4)+(((A)>=0x1F0||((A)&0xF)<8)?0:1) )
#define OVERS (2)
UNchar RG_[256];
UNchar GG_[256];
UNchar BG_[256];
UNshort RG0[256];
UNshort GG0[256];
UNshort BG0[256];
UNshort RG1[256];
UNshort GG1[256];
UNshort BG1[256];
int DataMd;
int DataX,DataY; // 画像データのサイズ
int DataC;
int PreDataMd;
/**************************************************
スキャン
スキャンします
スキャナを初期化します
1/1200inch に設定します
pr=0 でプリスキャンします
pr に格納アドレス。サイズを間違えないよう。
[out] -1;その他のエラー
-2;SCSI エラー
-3;パラメータエラー
-4;メモリ足りないエラー
-9;中断
-99;ダイアログなしエラー(Scan() でエラー表示しちゃってる)
0;正常
**************************************************/
int Scan(pr,id)
int id;
UNchar *pr;
{
int i,j,l,k,v,x,y,z,d,xxx,yyy,x_,y_;
int mm1,mm2,vs,scx,scy,ll;
int rr,gg,bb;
int md,mp;
int bx,by,oln;
int ssp;
UNchar *M,*N,*MM,*MC;
UNshort *MS;
UNchar buf[512];
//---
oln=0;
bx=1;
by=1;
if ( pr!=0 ){
if ( ImageDirec==0 ){ // 0;縦 1;横
scx=ScanDotX/DOTB;
scy=ScanDotY/DOTB;
} else {
scx=ScanDotY/DOTB;
scy=ScanDotX/DOTB;
}
DataX=scx;
DataY=scy;
//printf(" %d,%d ",ScanDpiX/10000,ScanDpiY/10000);
if ( ScanDpiX<700000 || ScanDpiY<700000 ){
// X の DPI が小さいオーバーキャンするぞー
#if SCERR == 1
//printf(" overscan!!/n");
#endif
bx=2;
by=2;
scx*=bx;
scy*=by;
}
if ( ScanDpiX<140000 || ScanDpiY<140000 ){
return(-3);
}
if ( mat_vadds!=0 ){
if ( (ScanDotX/DOTB)>mat_xwidth || (ScanDotY/DOTB)>mat_ywidth ){
sprintf(buf,"(%d,%d)をこえています",mat_xwidth,mat_ywidth);
Dialog("マチエールの仮想画面サイズ",buf,"スキャン出来ません",1);
return(-99);
}
}
} else{
bx=2;
by=1;
}
//=========== 初期化 発行
BUSYS( i=_scsi_initialize(id) );
if ( i!=0 ){
#if SCERR == 1
printf("initialize でエラー(%d)\n",i);
#endif
if ( i==2 ){
i=request_disp2(id);
sprintf(buf,"SNS=%02X:ASC=%02X:ASCQ=%02X",i/0x10000,(i/0x100)&0xFF,i&0xFF );
Dialog("JX エラーがでました。","[init.]",buf,1 );
return(-99);
}
return(-2);
}
//=========== modeselect (n/inch の設定)発行
if ( jxscanner!=_JX270_ ){
for(i=0;i<16;buf[i++]=0);
buf[4]=0x03; // MODE PARAMETER MEASUREMENT UNIT PAGE
buf[5]=0x06; // Page Length
buf[8]=0x04; // 1/1200 inch 指定
buf[9]=0xB0; //
BUSYS( i=_scsi_modeselect(0x10,4+8,id,buf) );
if ( i!=0 ){
#if SCERR == 1
printf("modeselect でエラー(%d)\n",i);
#endif
if ( i==2 ){
i=request_disp2(id);
sprintf(buf,"SNS=%02X:ASC=%02X:ASCQ=%02X",i/0x10000,(i/0x100)&0xFF,i&0xFF );
Dialog("JX エラーがでました。","[mode sel.]",buf,1 );
return(-99);
}
return(-2);
}
} else {
;// ☆ JX270 は modesense を持っていない!
}
//=========== get window 発行
//printf("get window!!\n");
if ( jxscanner==_JX330_ ){
BUSYS( i=_scsi_getwindow( id,0x37+8,buf) );
} else if ( jxscanner==_JX270_ ){
// ☆ JX270 は getwindow は持っていない!
for(i=0;i<70;buf[i++]=0);
buf[6]=0x33;
// buf[57]=0b01111000;
buf[30]=0x80;
buf[31]=0x80;
buf[32]=0x80;
buf[33]=0x05;
buf[34]=0x08;
buf[37]=0x03; //Padding
buf[48]=0xFF;
buf[49]=0x09;
buf[50]=0x60;
buf[51]=0xFF;
buf[53]=0x03;
buf[54]=0x18;
buf[55]=0x01;
buf[56]=0x84;
i=0;
} else {
// JX250,JX350
BUSYS( i=_scsi_getwindow( id,0x44+8,buf) );
}
if ( i!=0 ){
#if SCERR == 1
printf("getwindow でエラー(%d)\n",i);
#endif
if ( i==2 ){
i=request_disp2(id);
sprintf(buf,"SNS=%02X:ASC=%02X:ASCQ=%02X",i/0x10000,(i/0x100)&0xFF,i&0xFF );
Dialog("JX エラーがでました。","[get win.]",buf,1 );
return(-99);
}
return(-2);
}
//=========== set window 発行
//printf("set window!!\n");
buf[0]=0;
buf[1]=0;
if ( pr==0 ){
//==== プリスキャン
//--- 範囲設定
*(int*)&buf[14]=0; // 読み取り位置
*(int*)&buf[18]=0;
*(int*)&buf[22]=10224; // 読み取り幅 最大を設定
*(int*)&buf[26]=14064; // 最大を設定
if ( jxscanner!=_JX270_ ){
i=232*2; // DOT 指定
buf[49]=i/0x100;
buf[50]=i&0xFF;
i=480; // DOT 指定
buf[51]=i/0x100;
buf[52]=i&0xFF;
//--- モード設定
buf[48]&=nbit(2); // 高速読み取り
if ( jxscanner==_JX250_ || jxscanner==_JX350_ )
buf[66]=0x80; // ドラフト取り込み
} else {
// JX270
// *(int*)&buf[22]=5020; // 読み取り幅 最大を設定
// *(int*)&buf[26]=7028; // 最大を設定
i=232*2; // DOT 指定
buf[53]=i/0x100;
buf[54]=i&0xFF;
i=480; // DOT 指定
buf[55]=i/0x100;
buf[56]=i&0xFF;
// *(short*)&buf[10]=300;
// *(short*)&buf[12]=300;
// buf[57]|=bit(3); // 校正早く
}
} else {
//==== 本スキャン
//--- 範囲設定
*(int*)&buf[14]=PreX1; // 読み取り位置
*(int*)&buf[18]=PreY1;
*(int*)&buf[22]=(PreX2-1)-PreX1; // 読み取り幅
*(int*)&buf[26]=(PreY2-1)-PreY1; //
if ( jxscanner!=_JX270_ ){
i=scx; // DOT 指定
buf[49]=i/0x100;
buf[50]=i&0xFF;
i=scy; // DOT 指定
buf[51]=i/0x100;
buf[52]=i&0xFF;
//--- モード設定
if ( ScanSpeed==0 )
buf[48]|=bit(2); // 精細読み取り
else buf[48]&=nbit(2); // 高速読み取り
if ( jxscanner==_JX250_ || jxscanner==_JX350_ )
buf[66]=0x00; // 通常取り込み nonドラフト
} else {
// JX270
// i=scx; // DOT 指定
// buf[53]=i/0x100;
// buf[54]=i&0xFF;
// i=scy; // DOT 指定
// buf[55]=i/0x100;
// buf[56]=i&0xFF;
*(short*)&buf[10]=(int)((double)ScanDpiX/DPIB);
*(short*)&buf[12]=(int)((double)ScanDpiY/DPIB);
buf[57]&=nbit(3); // 校正精密に
}
}
//--- モード設定
if ( ImageColMode==0 ){ // 0;多値 1;二値
buf[34]=0x08; //
if ( ImageMode==0 ) // 0;カラー 1;白黒
md=0x05; // モード フルカラー
else md=0x02; // グレイスケール
} else {
buf[34]=0x01; //
if ( ImageMode==0 ) // 0;カラー 1;白黒
md=0x03; // カラー2値
else md=0x00; // 単純2値
}
buf[33]=md;
buf[37]=0x80; // RIF=1 Padding=0
if ( jxscanner!=_JX270_ ){
if ( jxscanner==_JX250_ || jxscanner==_JX350_ ){
buf[71]=1; // 補正なし
//buf[71]=0; // ユーザーγ補正
}
//--- 各種
if ( jxscanner==_JX330_ ){
// JX330 範囲が違う
i=Bright;
i=i-128;
i/=32;
buf[30]=0x80+i; // 濃度補正
} else {
buf[30]=Bright; // 濃度補正
}
buf[48]&=0xCF; // ドロップアウトカラー
buf[48]|=(DropColor<<4); //
buf[53]=LightR/0x100; // 明度R
buf[54]=LightR&0xFF; //
buf[55]=LightG/0x100; // 明度G
buf[56]=LightG&0xFF; //
buf[57]=LightB/0x100; // 明度B
buf[58]=LightB&0xFF; //
buf[59]=LightM/0x100; // 明度M
buf[60]=LightM&0xFF; //
buf[31]=ThreM; // しきい値 BW
if ( jxscanner==_JX250_ || jxscanner==_JX350_ || jxscanner==_JX270_ ){
buf[63]=ThreR; // しきい値 R
buf[64]=ThreG; // しきい値 G
buf[65]=ThreB; // しきい値 B
}
} else {
// JX270
;
buf[37]=0x00; // RIF=0 Padding=1
}
//--- 設定
if ( jxscanner==_JX250_ || jxscanner==_JX350_ ){
BUSYS( i=_scsi_setwindow( id,0x44+8,buf) );
} elif ( jxscanner==_JX270_ ){
// dumps(buf,70-10);
BUSYS( i=_scsi_setwindow( id,0x3B,buf) );
} else {
BUSYS( i=_scsi_setwindow( id,0x37+8,buf) );
}
if ( i!=0 ){
#if SCERR == 1
printf("setwindow でエラー(%d)\n",i);
#endif
if ( i==2 ){
i=request_disp2(id);
if ( (i&0xFF)==5 )
return(-3);
sprintf(buf,"SNS=%02X:ASC=%02X:ASCQ=%02X",i/0x10000,(i/0x100)&0xFF,i&0xFF );
Dialog("JX エラーがでました。","[set win.]",buf,1 );
return(-99);
}
return(-2);
}
//=========== scan 発行
//printf("scan!!\n");
if ( jxscanner!=_JX270_ ){
BUSYS( i=_scsi_scan(id) );
if ( i!=0 ){
#if SCERR == 1
printf("scan でエラー(%d)\n",i);
#endif
if ( i==2 ){
i=request_disp2(id);
sprintf(buf,"SNS=%02X:ASC=%02X:ASCQ=%02X",i/0x10000,(i/0x100)&0xFF,i&0xFF );
Dialog("JX エラーがでました。","[scan]",buf,1 );
return(-99);
}
return(-2);
}
}
//======= γ補正&減色データ制作
MakeGammaTable(md);
//=========== testunit 発行 busy 待ち
while( (i=_scsi_testunit(id))==8 ){
if ( MS_RSW()!=0 ){
if ( Dialog("","中止しますか?","",2)==0 ){
// 中止
BUSYS( i=_scsi_initialize(id) );
return(-9);
}
} elif ( (_iocs_bitsns(0)&bit(1))!=0 ){
while( (_iocs_bitsns(0)&bit(1))!=0 );
if ( Dialog("","中止しますか?","",2)==0 ){
// 中止
BUSYS( i=_scsi_initialize(id) );
return(-9);
}
}
}
if ( i!=0 ){
#if SCERR == 1
printf("testunit でエラー(%d)\n",i);
#endif
if ( i==2 ){
i=request_disp2(id);
sprintf(buf,"SNS=%02X:ASC=%02X:ASCQ=%02X",i/0x10000,(i/0x100)&0xFF,i&0xFF );
Dialog("JX エラーがでました。","[testunit]",buf,1 );
return(-99);
}
return(-2);
}
//=========== read 繰り返し
//----- 主走査,副走査のドット得る
if ( jxscanner!=_JX270_ ){
BUSYS( i=_scsi_scanread( id,0x81,0,4,buf) );
if ( i!=0 ){
#if SCERR == 1
printf("read でエラー(%d)\n",i);
#endif
if ( i==2 ){
i=request_disp2(id);
sprintf(buf,"SNS=%02X:ASC=%02X:ASCQ=%02X",i/0x10000,(i/0x100)&0xFF,i&0xFF );
Dialog("JX エラーがでました。","[read]",buf,1 );
return(-99);
}
return(-2);
}
x=buf[1]*0x100+buf[0];
y=buf[3]*0x100+buf[2];
} else {
//BUSYS( i=_scsi_scanread27( id,0x20,0x0A0D,0x7,buf) );
BUSYS( i=_scsi_scanread( id,0x80,0x0A0D,7,buf) );
if ( i!=0 ){
#if SCERR == 1
printf("read でエラー(%d)\n",i);
#endif
if ( i==2 ){
i=request_disp2(id);
sprintf(buf,"SNS=%02X:ASC=%02X:ASCQ=%02X",i/0x10000,(i/0x100)&0xFF,i&0xFF );
Dialog("JX エラーがでました。","[read]",buf,1 );
return(-99);
}
return(-2);
}
//x=*(int*)&buf[0];
//y=*(int*)&buf[4];
x=buf[3]*0x100+buf[4];
y=buf[5]*0x100+buf[6];
x=232*2;
y=480;
}
if ( pr==0 ){
if ( x!=232*2 || y!=480 ){
#if SCERR == 1
printf("読み込みサイズがおかしふぃ(%d,%d :%d,%dのはず)\n",x,y,232*2,480);
#endif
return(-2);
}
} else {
if ( ImageColMode==0 ){ // 0;多値 1;二値
if ( x!=scx || y!=scy ){
#if SCERR == 1
printf("読み込みサイズがおかしふぃ(%d,%d :%d,%dのはず)\n",x,y,scx,scy);
#endif
return(-2);
}
} else {
if ( (x&0xFFF8)!=((scx+7)&0xFFF8) || y!=scy ){
#if SCERR == 1
printf("読み込みサイズがおかしふぃ(%d,%d :%d,%dのはず)\n",x,y,scx,scy);
#endif
return(-2);
}
x=scx;
}
}
//printf("主走査 = %d,複走査 = %d\n",x,y);
//--- バッファサイズ計算
if ( pr==0 ){
//============================= プリスキャン
MM=PreData;
PreDataMd=md;
xxx=232;
yyy=480;
x_=xxx;
} else {
//=========================== 本番
DataC=FullColor;
if ( md!=5 && md!=2 )
DataC=0;
if ( mat_vadds!=0 ){
FullColor=0; // 0;64k color 1;24bit color
DataC=0;
}
DataMd=md;
xxx=DataX;
yyy=DataY;
x_=xxx;
y_=yyy;
//----- 記憶用のメモリ
if ( DataC==0 ){
//--- 64k color
if ( mat_vadds==0 ){
if ( ImageDirec==0 ){
x_=(x_+7)&0xFFF8;
if ( x_<512 )
x_=512;
} else {
y_=(y_+7)&0xFFF8;
if ( y_<512 )
y_=512;
}
MM=_dos_malloc( x_*y_*2 );
} else {
// MAT の仮想画面
x_=mat_xwidth;
y_=mat_xwidth; //
MM=mat_vadds;
}
} else {
//--- 24bit color
if ( md==5 ) // フルカラー
i=3;
else i=1; // グレイスケール
MM=_dos_malloc( x_*y_*i );
}
if ( MM>=0x81000000 ){
// 確保出来なかった
return(-4);
}
}
//---
//printf("\r<< xxx=%d(_=%d),yyy=%d(_=%d) >>>",xxx,x_,yyy,y_);
//---
if ( md==5 ) // フルカラー
z=x*3;
elif ( md==3 ) // 二値カラー
z=((x+7)/8) *3;
elif ( md==2 ) // グレイスケール
z=x;
else z=((x+7)/8); // 二値
//----- ワーク用のメモリ
if ( ReadPacketMode==0 ){ // 0;一括 1;分割
M=_dos_malloc(z*y);
//M=0x82000000;
if ( M<0x81000000 ){
// 確保出来た 一括でよんじゃえ
//printf("scanread %X byte\n",z*y);
BUSYS( i=_scsi_scanread( id,0,0,z*y,M) );
if ( i!=0 ){
#if SCERR == 1
printf("read でエラー(%d)\n",i);
#endif
if ( i==2 ) request_disp(id);
_dos_mfree( M );
if ( pr!=0 && mat_vadds==0 )
_dos_mfree( MM );
return(-3);
}
oln=0;
} else {
ll=z*y;
M=_dos_malloc(z*by*100);
if ( M<0x81000000 ){
// 100ライン分確保出来た
oln=100;
} else {
M=_dos_malloc(z*by*32);
if ( M<0x81000000 ){
// 32ライン分確保出来た
oln=32;
} else {
M=_dos_malloc(z*by);
if ( M<0x81000000 ){
// 1ライン分確保出来た
oln=1;
} else {
// 確保出来なかった
if ( pr!=0 && mat_vadds==0 )
_dos_mfree(MM);
return(-4);
}
}
}
}
} else {
ll=z*y;
M=_dos_malloc(z*by*32);
if ( M<0x81000000 ){
// 32ライン分確保出来た
oln=32;
} else {
M=_dos_malloc(z*by);
if ( M<0x81000000 ){
// 1ライン分確保出来た
oln=1;
} else {
// 確保出来なかった
if ( pr!=0 && mat_vadds==0 )
_dos_mfree(MM);
return(-4);
}
}
}
//----
if ( PojiNegaMode!=0 ){ // 0;ポジ 1;ネガ
mm1=0;
mm2=0x1F;
} else {
mm1=0x1F;
mm2=0;
}
//----
ssp=_iocs_b_super(0);
for(l=0;l<yyy;l++){
// printf(" 複走査 = %d(%d)\r",l,y);
_dos_change_pr();
if ( MS_RSW()!=0 ){
//--- キャンセル ?
_iocs_home(0,0,0);
if ( Dialog("","中止しますか?","",2)==0 ){
// 中止
_dos_mfree(M);
if ( pr!=0 && mat_vadds==0 )
_dos_mfree(MM);
BUSYS( i=_scsi_initialize(id) );
return(-9);
}
MsPat(-1);
} elif ( (_iocs_bitsns(0)&bit(1))!=0 ){
while( (_iocs_bitsns(0)&bit(1))!=0 );
_iocs_home(0,0,0);
if ( Dialog("","中止しますか?","",2)==0 ){
// 中止
_dos_mfree(M);
if ( pr!=0 && mat_vadds==0 )
_dos_mfree(MM);
BUSYS( i=_scsi_initialize(id) );
return(-9);
}
MsPat(-1);
}
if ( oln==0 ){
N=&M[l*z*by];
} else {
if ( (l%oln)==0 ){
j=ll;
if ( j>z*by*oln )
j=z*by*oln;
BUSYS( i=_scsi_scanread( id,0,0,j,M) );
if ( i!=0 ){
#if SCERR == 1
//printf("read でエラー(%d)\n",i);
#endif
if ( ssp>0 )
_iocs_b_super(ssp);
if ( i==2 ){
i=request_disp2(id);
sprintf(buf,"SNS=%02X:ASC=%02X:ASCQ=%02X",i/0x10000,(i/0x100)&0xFF,i&0xFF );
Dialog("JX エラーがでました。","[read]",buf,1 );
return(-99);
}
return(-2);
}
ll-=j;
N=M;
} else {
N=&M[(l%oln)*z*by];
}
}
if ( pr==0 || ImageDirec==0 ){
//縦
if ( pr==0 ){
v=VADDS(0,0+16,l+16);
} else {
v=VADDS(0,0,l);
if ( l>=512 ){
v=VADDS(0,0,l&511);
_iocs_home(0,0,l&511);
}
}
vs=2; // x+1
MS=&MM[ (0+(l)*x_)*2 ];
if ( md==5 ) // フルカラー
MC=&MM[ (0+(l)*x_)*3 ];
else MC=&MM[ (0+(l)*x_) ];
mp=1;
} else {
v=VADDS(0,l,511);
if ( l>=512 ){
v=VADDS(0,l&511,511);
_iocs_home(0,l&511,0);
}
vs=-1024; // y-1
MS=&MM[ (l+(xxx-1)*y_)*2 ];
if ( md==5 ) // フルカラー
MC=&MM[ (l+(xxx-1)*y_)*3 ];
else MC=&MM[ (l+(xxx-1)*y_) ];
mp=-y_;
}
j=l&1;
if ( md==5 ){ // フルカラー
for(i=0;i<xxx;i++,v+=vs,j^=1){
if ( pr==0 ){
if ( PreViewS!=0 ){
d=(
RG0[ N[0] ]+
GG0[ N[x+0] ]+
BG0[ N[x+x+0] ]
);
} elif ( j==0 ){
d=(
RG0[(N[0]+N[1])/2]+
GG0[(N[x+0]+N[x+1])/2]+
BG0[(N[x+x+0]+N[x+x+1])/2]
);
} else {
d=(
RG1[(N[0]+N[1])/2]+
GG1[(N[x+0]+N[x+1])/2]+
BG1[(N[x+x+0]+N[x+x+1])/2]
);
}
N+=2;
} elif ( bx==1 ){
if ( j==0 )
d=RG0[N[0]]+GG0[N[x]]+BG0[N[x+x]];
else d=RG1[N[0]]+GG1[N[x]]+BG1[N[x+x]];
if ( DataC!=0 ){
MC[0]=RG_[N[0]];
MC[1]=GG_[N[x]];
MC[2]=BG_[N[x+x]];
MC+=mp*3;
}
N++;
} else {
rr=(N[0]+N[1]+N[x*3+0]+N[x*3+1])/4;
gg=(N[x+0]+N[x+1]+N[x*3+x+0]+N[x*3+x+1])/4;
bb=(N[x+x+0]+N[x+x+1]+N[x*3+x+x+0]+N[x*3+x+x+1])/4;
if ( j==0 )
d=RG0[rr]+GG0[gg]+BG0[bb];
else d=RG1[rr]+GG1[gg]+BG1[bb];
if ( DataC!=0 ){
MC[0]= RG_[rr];
MC[1]= GG_[gg];
MC[2]= BG_[bb];
MC+=mp*3;
}
N+=bx;
}
if ( i<512 )
*(UNshort*)v=d;
if ( pr==0 || DataC==0 ){
// 68k COLOR
*MS=d;
MS+=mp;
}
}
} elif ( md==3 ){ // カラー2値
j=(x+7)/8;
for(i=0;i<xxx;i++,v+=vs){
k=( bx==1 )?i:i*bx;
d=RGB(
((N[k/8 ]&bit(7-(k&7)))!=0)?mm1:mm2,
((N[k/8+j ]&bit(7-(k&7)))!=0)?mm1:mm2,
((N[k/8+j+j]&bit(7-(k&7)))!=0)?mm1:mm2
);
if ( i<512 )
*(UNshort*)v=d;
if ( pr==0 || DataC==0 ){
// 68k COLOR
*MS=d;
MS+=mp;
}
}
} elif ( md==2 ){ // グレイスケール
for(i=0;i<xxx;i++,v+=vs,j^=1){
if ( pr==0 ){
if ( PreViewS!=0 ){
d=RG0[ N[0] ];
} elif ( j==0 ){
d=RG0[(N[0]+N[1])/2];
} else {
d=RG1[(N[0]+N[1])/2];
}
N+=bx;
} elif ( bx==1 ){
if ( j==0 )
d=RG0[N[0]];
else d=RG1[N[0]];
if ( DataC!=0 ){
MC[0]= RG_[N[0]];
MC+=mp;
}
N++;
} else {
if ( j==0 )
d=RG0[(N[0]+N[1]+N[x+0]+N[x+1])/4];
else d=RG1[(N[0]+N[1]+N[x+0]+N[x+1])/4];
if ( DataC!=0 ){
MC[0]= RG_[(N[0]+N[1]+N[x+0]+N[x+1])/4];
MC+=mp;
}
N+=bx;
}
if ( i<512 )
*(UNshort*)v=d;
if ( pr==0 || DataC==0 ){
// 68k COLOR
*MS=d;
MS+=mp;
}
}
} else {
for(i=0;i<xxx;i++,v+=vs){
k=( bx==1 )?i:i*bx;
j=((N[k/8]&bit(7-(k&7)))!=0)?mm1:mm2;
d=RGB(j,j,j);
if ( i<512 )
*(UNshort*)v=d;
if ( pr==0 || DataC==0 ){
// 68k COLOR
*MS=d;
MS+=mp;
}
}
}
}
if ( ssp>0 )
_iocs_b_super(ssp);
_dos_mfree(M);
if ( pr!=0 ){
ScanData=MM;
ScanDataX=ScanDotX/DOTB;
ScanDataY=ScanDotY/DOTB;
//DataX=(ScanDataX+7)&0xFFF8;
if ( ImageDirec==0 )
DataX=x_;
else DataX=y_;
}
return(0);
}
/**************************************************
プレスキャン画面表示
bb= 0; x1
1; x2
2; x4
************************************************/
void PreviewView()
{
int i,v,l,bi,bisx,bisy;
int x,y,xx;
int ssp;
int bb;
int ofx,ofy;
UNshort *V,*M,*W;
p_12_sprintf(11*16+2+8,2,"x%d",1<<PreBai);
M=PreData;
ofx=PrePX;
ofy=PrePY;
x=232-ofx;
y=480-ofy;
bb=PreBai;
//printf(" 倍率 = %d\r",bb);
ssp=_iocs_b_super(0);
if ( bb>0 ){
// 1;x2 2;x4 3;x8
bi=1<<bb;
bisx=232/bi;
bisy=480/bi;
for(l=0;l<y;l++){
if ( l>=bisy )
break;
W=&M[ (ofx+(l+ofy)*232) ];
xx=x;
if ( xx>bisx )
xx=bisx;
v=VADDS(0,16,(l*bi)+16);
if ( bb==1 ){
for(i=0;i<xx;i++,v+=4)
GG2PSET_64_S(v,*W++);
} elif ( bb==2 ){
for(i=0;i<xx;i++,v+=8)
GG4PSET_64_S(v,*W++);
} elif ( bb==3 ){
for(i=0;i<xx;i++,v+=16)
GG8PSET_64_S(v,*W++);
}
}
ScroolBarX(232,232/bi,ofx);
ScroolBarY(480,480/bi,ofy);
} else {
M=PreData;
x=232;
y=480;
for(l=0;l<y;l++){
V=(VADDS(0,16,16)+1024*l);
for(i=0;i<x;i++)
*V++=*M++;
}
ScroolBarX(-1);
ScroolBarY(-1);
}
if ( ssp>0 )
_iocs_b_super(ssp);
}
/*************************************************
γ補正&減色データ制作
*************************************************/
void MakeGammaTable(md)
int md;
{
int i,j,m,n;
double a,b;
if ( md==5 ){
// カラー
for(i=0;i<256;i++){
b=(double)GammaR/100.;
a=(pow((double)i/255.,(1./b)))*255;
m=(int)a;
RG_[i]=m;
n=m>>3;
j=( (m&0x7)<4 || n>=0x1F )?0:1;
RG0[i]=RGB(n ,0,0);
if ( C64halfMode==0 ) // 0;中間処理あり 1;なし
RG1[i]=RGB(n+j,0,0);
else RG1[i]=RG0[i];
//
b=(double)GammaG/100.;
a=(pow((double)i/255.,(1./b)))*255;
m=(int)a;
GG_[i]=m;
n=m>>3;
j=( (m&0x7)<4 || n>=0x1F )?0:1;
GG0[i]=RGB(0,n ,0);
if ( C64halfMode==0 ) // 0;中間処理あり 1;なし
GG1[i]=RGB(0,n+j,0);
else GG1[i]=GG0[i];
//
b=(double)GammaB/100.;
a=(pow((double)i/255.,(1./b)))*255;
m=(int)a;
BG_[i]=m;
n=m>>3;
j=( (m&0x7)<4 || n>=0x1F )?0:1;
BG0[i]=RGB(0,0,n );
if ( C64halfMode==0 ) // 0;中間処理あり 1;なし
BG1[i]=RGB(0,0,n+j);
else BG1[i]=BG0[i];
if ( PojiNegaMode!=0 ){ // 0;ポジ 1;ネガ
RG0[i]=RGB(31,0,0)-RG0[i];
RG1[i]=RGB(31,0,0)-RG1[i];
GG0[i]=RGB(0,31,0)-GG0[i];
GG1[i]=RGB(0,31,0)-GG1[i];
BG0[i]=RGB(0,0,31)-BG0[i];
BG1[i]=RGB(0,0,31)-BG1[i];
RG_[i]=255-RG_[i];
GG_[i]=255-GG_[i];
BG_[i]=255-BG_[i];
}
}
} elif ( md==2 ) {
// グレイスケール
for(i=0;i<256;i++){
b=(double)GammaM/100.;
a=(pow((double)i/255.,(1./b)))*255;
m=(int)a;
RG_[i]=m;
n=m>>3;
j=( (m&0x7)<4 || n>=0x1F )?0:1;
RG0[i]=RGB(n ,n ,n );
if ( C64halfMode==0 ) // 0;中間処理あり 1;なし
RG1[i]=RGB(n+j,n+j,n+j);
else RG1[i]=RG0[i];
if ( PojiNegaMode!=0 ){ // 0;ポジ 1;ネガ
RG0[i]=0xFFFE-RG0[i];
RG1[i]=0xFFFE-RG1[i];
RG_[i]=255-RG_[i];
}
}
} elif ( md==0 ) {
//γ補正無し変換用(24bit->64k)
for(i=0;i<256;i++){
m=i;
RG_[i]=m;
n=m>>3;
j=( (m&0x7)<4 || n>=0x1F )?0:1;
RG0[i]=RGB(n,0,0);
GG0[i]=RGB(0,n,0);
BG0[i]=RGB(0,0,n);
if ( C64halfMode==0 ){ // 0;中間処理あり 1;なし
RG1[i]=RGB(n+j,0,0);
GG1[i]=RGB(0,n+j,0);
BG1[i]=RGB(0,0,n+j);
} else {
RG1[i]=RG0[i];
GG1[i]=GG0[i];
BG1[i]=BG0[i];
}
}
}
return;
}